#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <windows.h>
#include "funcVarias.h"


 /////////////////////------------------------------fechas!-------------------------------------------------


void intercambio(int *a, int *b)
{
    int aux;
    aux=*a;
    *a=*b;
    *b=aux;
}

int cant_dias_mes(int m, int a)
{
    int v[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(es_bisiesto(a)==1)
            v[1]=29;
    return(v[m-1]);
}
void suma_ndias(t_fecha a, int n)
{
    int df, mf, af;
    df=a.dia+n;
    mf=a.mes;
    af=a.anio;
    while(df>cant_dias_mes(mf,af))
    {
        df-=cant_dias_mes(mf,af);
        mf++;
        if(mf>12)
        {
            af++;
            mf=1;
        }
    }
    printf("\nLa fecha ingresada mas %d dias es: %d/%d/%d", n, df, mf, af);

}

void dia_siguiente(t_fecha a)
{
    suma_ndias(a, 1);
}




int dia_entfecha(t_fecha fi, t_fecha ff)
{
    int cd=0;
    if(fi.anio>ff.anio || fi.mes>ff.mes || fi.dia>ff.dia)
    {
        intercambio(&fi.dia, &ff.dia);
        intercambio(&fi.mes, &ff.mes);
        intercambio(&fi.anio, &ff.anio);
    }
    cd=ff.dia-fi.dia;
        while(fi.anio<ff.anio || fi.mes<ff.mes)
        {
            cd+=cant_dias_mes(fi.mes,fi.anio);
            fi.mes++;
            if(fi.mes>12)
            {
                fi.mes=1;
                fi.anio++;
            }
        }
    return(cd);
 }

int dia_en_fecha(t_fecha a, t_fecha b)
{
    long int n;
    a.dia=1;
    a.mes=1;
    a.anio=1978;
    n=dia_entfecha(a, b);
    return(n%7);
}

 int fecha_es_menor(t_fecha fec_1,t_fecha fec_2)
 {
   if (fec_1.anio<fec_2.anio)
      return 1;
    if (fec_1.anio==fec_2.anio && fec_1.mes<fec_2.mes)
        return 1;
      if( fec_1.mes==fec_2.mes && fec_1.dia<fec_2.dia)
            return 1;
        else
            return 0;

}



void solicita_path(char *ruta,const char *msj)
{
    printf("\nPor Favor, Ingrese la ubicacion del %s:\n", msj);
    gets(ruta);
    fflush(stdin);

}


 t_fecha resta_anios(const t_fecha fecha, int anios)
 {
     t_fecha fec_aux;
     fec_aux.dia= fecha.dia;
     fec_aux.mes= fecha.mes;
     fec_aux.anio=(fecha.anio)-10;

     if(fecha.dia==29 && fecha.mes==2)
     {
        fec_aux.dia=1;
        fec_aux.mes=3;
     }
    return(fec_aux);
 }

int valida_fecha(t_fecha fec)
{
    if(fec.anio>1500 && fec.anio<2500)
    {
        if(fec.mes>0 && fec.mes<13)
        {
                if(fec.dia >0 && fec.dia <= cant_dias_mes(fec.mes, fec.anio))
                    return 1;
                else
                    return 0;
        }
        else
            return 0;
    }
    else
        return 0;
}

//-------------------------VARIAS-------------------------------------------




int str_len(const char *cad)
{
    int c=0;
    while(*cad)
    {
        c++;
        cad++;
    }
    return c;
}



char pedir_opcion(const char opc[][70], const char *titulo, const char *msj)
{
    int i;
    char op;
    system("CLS");
    printf("\n     %s", titulo);
    printf("\n\n\n");
    for(i=0; i < str_len(opc[0]);i++)
        printf("\n %c- %s", opc[0][i],opc[i+1]);
    printf("\n\n %s",msj);
    fflush(stdin);
    scanf("%c",&op);
    fflush(stdin);
    return op;
}

void pausa(const char *msj)
{
    if(*msj)
        printf("\n%s", msj);
    puts("\nPulse Enter para continuar...");
    fflush(stdin);
    scanf("%*c");
}



void fin_anormal(const char *msj)
{
    pausa(msj);
    exit(1);
}


int valida_dni (long dni)
{

    if (dni>10000 && dni<100000000)
        return 1;
    else
        return 0;
}

int valida_apyn (const char* apyn)
{
    if (strlen(apyn)<=40)
        return 1;
    else
        return 0;
}

int valida_fec_nac(t_fecha fecha_nac, t_fecha fecha_proc)
{
    t_fecha f_aux=resta_anios(fecha_proc, 10), f_aux2;
    f_aux2.dia=f_aux.dia;
    f_aux2.mes=f_aux.mes;
    f_aux2.anio=f_aux.anio;
    if(valida_fecha(fecha_nac) && fecha_es_menor(fecha_nac, f_aux2))
        return 1;
    else
        return 0;
}

int valida_sexo(char sexo)
{
    sexo= toupper(sexo);
    if(sexo=='F' || sexo=='M')
        return 1;
    else
        return 0;
}

int valida_fec_ingre(t_fecha f_nac, t_fecha f_ing, t_fecha f_proc )
{
    if(fecha_es_menor(f_nac,f_ing) && (fecha_es_menor(f_ing, f_proc)|| dia_entfecha(f_ing, f_proc)==0))
        return 1;
    else
        return 0;
}

int valida_carrera(const char *car)
{
    int i;
    char carreras[9][4]={"INF","ELE","IND","ECO","DER","ADM","MED","EDF","FIL"};
    for(i=0;i<10;i++)
    {
        if(strcmpi(carreras[i],car)==0)
            return 1;
    }
    return 0;
}

int valida_mat_aprob(int cantidad)
{
    if (cantidad>0)
        return 1;
    else
        return 0;
}

int valida_fec_faum(t_fecha f_ingre, t_fecha f_aum, t_fecha f_proc)
{
    if(fecha_es_menor(f_ingre,f_aum) && (fecha_es_menor(f_aum,f_proc)|| dia_entfecha(f_aum,f_proc)==0))
        return 1;
    else
        return 0;
}

int valida_estado(const char estado)
{
    if (estado=='R')
        return 1;
    else
        return 0;
}

int valida_fec_baja(t_fecha fecha, char estado)
{
    if (fecha.dia==1 && fecha.mes==1 && fecha.anio==1601 ) //&& estado=='R')
        {
            if (estado=='R')
                return 1;
            else
                return 0;
        }
    return 0;
}

int valida_datos (t_alumno alum, t_fecha fec_proc)
{
    if(
        valida_dni(alum.dni) &&
        valida_apyn (alum.apyn) &&
        valida_fec_nac(alum.fec_nac, fec_proc) &&
        valida_sexo(alum.sexo) &&
        valida_fec_ingre(alum.fec_nac, alum.fec_ingre, fec_proc) &&
        valida_carrera(alum.carrera) &&
        valida_mat_aprob(alum.mat_aprob) &&
        valida_fec_faum(alum.fec_ingre, alum.fec_faum, fec_proc) &&
        valida_estado(alum.estado) &&
        valida_fec_baja(alum.fec_baja,alum.estado))
        return 1;
    else
        return 0;
}

char menu(const char opc[][70], const char *titulo)
{
    char op= pedir_opcion(opc, titulo,"Su opcion: ");
    op= toupper(op);
    while (!strchr(opc[0],op))
    {
        system("cls");
        op = pedir_opcion(opc, titulo, "Opcion erronea. Su opcion: ");
        op = toupper(op);
    }
    return op;
}


void pasa_a_mayusculas(char *cad)
{
    int i=0;
    while(*(cad+i))
    {
        *(cad+i)=toupper(*(cad+i));
        i++;
    }
}
